home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / program / multiclr.lha / MC / multicolor.h < prev    next >
C/C++ Source or Header  |  1995-10-02  |  12KB  |  422 lines

  1. /******************************************************************************
  2. **                                                                           **
  3. ** MultiColor-Include                                                        **
  4. **                                                                           **
  5. **---------------------------------------------------------------------------**
  6. ** V2.0 vom 01.10.95                                                         **
  7. ******************************************************************************/
  8.  
  9. /* Prototypes für Libraryfunctions */
  10.  
  11. #include <proto/exec.h>
  12. #include <proto/graphics.h>
  13. #include <proto/intuition.h>
  14.  
  15. /* Includes */
  16.  
  17. #include <exec/types.h>
  18. #include <exec/exec.h>
  19. #include <exec/lists.h>
  20. #include <exec/memory.h>
  21. #include <exec/nodes.h>
  22. #include <graphics/gfx.h>
  23. #include <graphics/gfxmacros.h>
  24. #include <graphics/display.h>
  25. #include <graphics/displayinfo.h>
  26. #include <intuition/intuition.h>
  27. #include <intuition/intuitionbase.h>
  28. #include <intuition/screens.h>
  29. #include <math.h>
  30. #include <stdlib.h>
  31. #include <stdio.h>
  32. #include <string.h>
  33. #include <time.h>
  34.  
  35. /* die entsprechenden Matheroutinen includen */
  36.  
  37. #ifdef _M68881
  38.     #include <m68881.h>
  39. #endif
  40.  
  41. /* Definitionen */
  42.  
  43. typedef struct
  44. {
  45.     ULONG    Red,Green,Blue;
  46. } Triplet_32;
  47.  
  48. typedef struct
  49. {
  50.     WORD        NumColors;
  51.     WORD        FirstColor;
  52.     Triplet_32    Triplet[256];
  53.     WORD        Terminator;
  54. } Palette_32;
  55.  
  56. typedef struct
  57. {
  58.     double r,g,b;
  59. } MCPoint;
  60.  
  61. typedef struct
  62. {
  63.     struct RastPort rp[256];
  64.     struct ViewPort *vp;
  65.     UBYTE ix_r[86],ix_g[86],ix_b[86];
  66.     UBYTE ix_back[256];
  67.     UWORD xres,yres;
  68.     Palette_32 palette;
  69.     MCPoint error;
  70.     double cfact;
  71. } MCHandle;
  72.  
  73. /* Functions ************************************************************************************************/
  74.  
  75. MCHandle *MC_Init(struct Screen *scr,struct Window *win,UBYTE dep)
  76. {
  77.     register UWORD i,cnum;
  78.     MCHandle *mch=0l;
  79.     UBYTE cd[17];
  80.  
  81.     if(mch=AllocMem(sizeof(MCHandle),MEMF_ANY|MEMF_CLEAR))
  82.     {
  83.         mch->vp=&scr->ViewPort;
  84.         for(i=0;i<(1L<<dep);i++)
  85.         {
  86.             mch->rp[i]=*win->RPort;
  87.             SetAPen(&(mch->rp[i]),i);
  88.         }
  89.  
  90.         mch->xres=(UWORD)((double)(scr->Width)/1.5);
  91.         mch->yres=(scr->Height)>>1;
  92.  
  93.         mch->palette.Triplet[0].Red  =0l;
  94.         mch->palette.Triplet[0].Green=0l;
  95.         mch->palette.Triplet[0].Blue =0l;
  96.  
  97.         switch(dep)
  98.         {
  99.             case 4:            /* r,g,b  6 Abstufungen =>    216 Farben */
  100.                 cd[1]=48;cd[2]=96;cd[3]=144;cd[4]=192;cd[5]=240;
  101.                 cnum=1;
  102.                 mch->ix_b[0]=mch->ix_g[0]=mch->ix_r[0]=0;
  103.                 for(i=1;i<6;i++) { mch->ix_b[i]=cnum;cnum++; }
  104.                 for(i=1;i<6;i++) { mch->ix_g[i]=cnum;cnum++; }
  105.                 for(i=1;i<6;i++) { mch->ix_r[i]=cnum;cnum++; }
  106.  
  107.                 cnum=1;
  108.                 mch->ix_back[0]=0;
  109.                 for(i=1;i<6;i++) { mch->ix_back[cnum]=i;cnum++; }
  110.                 for(i=1;i<6;i++) { mch->ix_back[cnum]=i;cnum++; }
  111.                 for(i=1;i<6;i++) { mch->ix_back[cnum]=i;cnum++; }
  112.  
  113.                 cnum=1;
  114.                 for(i=1;i<6;i++)
  115.                 {
  116.                     mch->palette.Triplet[cnum].Red  =0l;
  117.                     mch->palette.Triplet[cnum].Green=0l;
  118.                      mch->palette.Triplet[cnum].Blue =(ULONG)(0x01010101*cd[i]);
  119.                     cnum++;
  120.                 }
  121.                 for(i=1;i<6;i++)
  122.                 {
  123.                     mch->palette.Triplet[cnum].Red  =0l;
  124.                     mch->palette.Triplet[cnum].Green=(ULONG)(0x01010101*cd[i]);
  125.                      mch->palette.Triplet[cnum].Blue =0l;
  126.                     cnum++;
  127.                 }
  128.                 for(i=1;i<6;i++)
  129.                 {
  130.                     mch->palette.Triplet[cnum].Red  =(ULONG)(0x01010101*cd[i]);
  131.                     mch->palette.Triplet[cnum].Green=0l;
  132.                      mch->palette.Triplet[cnum].Blue =0l;
  133.                     cnum++;
  134.                 }
  135.                 mch->palette.NumColors=16;
  136.                 mch->cfact=5.0;
  137.                 break;
  138.             case 5:            /* r,g,b 11 Abstufungen =>   1331 Farben */
  139.                 cd[1]=32;cd[2]=48;cd[3]=80;cd[4]=96;cd[5]=128;cd[6]=144;
  140.                 cd[7]=176;cd[8]=192;cd[9]=224;cd[10]=240;
  141.                 cnum=1;
  142.                 mch->ix_b[0]=mch->ix_g[0]=mch->ix_r[0]=0;
  143.                 for(i=1;i<11;i++) { mch->ix_b[i]=cnum;cnum++; }
  144.                 for(i=1;i<11;i++) { mch->ix_g[i]=cnum;cnum++; }
  145.                 for(i=1;i<11;i++) { mch->ix_r[i]=cnum;cnum++; }
  146.  
  147.                 cnum=1;
  148.                 mch->ix_back[0]=0;
  149.                 for(i=1;i<11;i++) { mch->ix_back[cnum]=i;cnum++; }
  150.                 for(i=1;i<11;i++) { mch->ix_back[cnum]=i;cnum++; }
  151.                 for(i=1;i<11;i++) { mch->ix_back[cnum]=i;cnum++; }
  152.  
  153.                 cnum=1;
  154.                 for(i=1;i<11;i++)
  155.                 {
  156.                     mch->palette.Triplet[cnum].Red  =0l;
  157.                     mch->palette.Triplet[cnum].Green=0l;
  158.                      mch->palette.Triplet[cnum].Blue =(ULONG)(0x01010101*(i<<4));
  159.                     cnum++;
  160.                 }
  161.                 for(i=1;i<11;i++)
  162.                 {
  163.                     mch->palette.Triplet[cnum].Red  =0l;
  164.                     mch->palette.Triplet[cnum].Green=(ULONG)(0x01010101*(i<<4));
  165.                      mch->palette.Triplet[cnum].Blue =0l;
  166.                     cnum++;
  167.                 }
  168.                 for(i=1;i<11;i++)
  169.                 {
  170.                     mch->palette.Triplet[cnum].Red  =(ULONG)(0x01010101*(i<<4));
  171.                     mch->palette.Triplet[cnum].Green=0l;
  172.                      mch->palette.Triplet[cnum].Blue =0l;
  173.                     cnum++;
  174.                 }
  175.                 mch->palette.Triplet[cnum].Red  =0xFFFFFFFF;
  176.                 mch->palette.Triplet[cnum].Green=0xFFFFFFFF;
  177.                  mch->palette.Triplet[cnum].Blue =0xFFFFFFFF;
  178.                 mch->palette.NumColors=32;
  179.                 mch->cfact=10.0;
  180.                 break;
  181.             case 6:            /* r,g,b 16 Abstufungen =>   4096 Farben */
  182.                 cd[1]=32;cd[2]=48;cd[3]=128;cd[4]=144;cd[5]=160;cd[6]=176;
  183.                 cd[7]=192;cd[8]=208;cd[9]=224;cd[10]=240;
  184.                 mch->ix_b[0]=mch->ix_g[0]=mch->ix_r[0]=0;
  185.                 mch->ix_b[ 1]=33;mch->ix_g[ 1]=43;mch->ix_r[ 1]=53;
  186.                 mch->ix_b[ 2]= 1;mch->ix_g[ 2]=11;mch->ix_r[ 2]=21;
  187.                 mch->ix_b[ 3]= 2;mch->ix_g[ 3]=12;mch->ix_r[ 3]=22;
  188.                 mch->ix_b[ 4]=36;mch->ix_g[ 4]=46;mch->ix_r[ 4]=56;
  189.                 mch->ix_b[ 5]=38;mch->ix_g[ 5]=48;mch->ix_r[ 5]=58;
  190.                 mch->ix_b[ 6]=40;mch->ix_g[ 6]=50;mch->ix_r[ 6]=60;
  191.                 mch->ix_b[ 7]=42;mch->ix_g[ 7]=52;mch->ix_r[ 7]=62;
  192.                 mch->ix_b[ 8]= 3;mch->ix_g[ 8]=13;mch->ix_r[ 8]=23;
  193.                 mch->ix_b[ 9]= 4;mch->ix_g[ 9]=14;mch->ix_r[ 9]=24;
  194.                 mch->ix_b[10]= 5;mch->ix_g[10]=15;mch->ix_r[10]=25;
  195.                 mch->ix_b[11]= 6;mch->ix_g[11]=16;mch->ix_r[11]=26;
  196.                 mch->ix_b[12]= 7;mch->ix_g[12]=17;mch->ix_r[12]=27;
  197.                 mch->ix_b[13]= 8;mch->ix_g[13]=18;mch->ix_r[13]=28;
  198.                 mch->ix_b[14]= 9;mch->ix_g[14]=19;mch->ix_r[14]=29;
  199.                 mch->ix_b[15]=10;mch->ix_g[15]=20;mch->ix_r[15]=30;
  200.  
  201.                 cnum=1;
  202.                 mch->ix_back[ 0]= 0;
  203.                 mch->ix_back[33]=mch->ix_back[43]=mch->ix_back[53]= 1;
  204.                 mch->ix_back[ 1]=mch->ix_back[11]=mch->ix_back[21]= 2;
  205.                 mch->ix_back[ 2]=mch->ix_back[12]=mch->ix_back[22]= 3;
  206.                 mch->ix_back[36]=mch->ix_back[46]=mch->ix_back[56]= 4;
  207.                 mch->ix_back[38]=mch->ix_back[48]=mch->ix_back[58]= 5;
  208.                 mch->ix_back[40]=mch->ix_back[50]=mch->ix_back[60]= 6;
  209.                 mch->ix_back[42]=mch->ix_back[52]=mch->ix_back[62]= 7;
  210.                 mch->ix_back[ 3]=mch->ix_back[13]=mch->ix_back[23]= 8;
  211.                 mch->ix_back[ 4]=mch->ix_back[14]=mch->ix_back[24]= 9;
  212.                 mch->ix_back[ 5]=mch->ix_back[15]=mch->ix_back[25]=10;
  213.                 mch->ix_back[ 6]=mch->ix_back[16]=mch->ix_back[26]=11;
  214.                 mch->ix_back[ 7]=mch->ix_back[17]=mch->ix_back[27]=12;
  215.                 mch->ix_back[ 8]=mch->ix_back[18]=mch->ix_back[28]=13;
  216.                 mch->ix_back[ 9]=mch->ix_back[19]=mch->ix_back[29]=14;
  217.                 mch->ix_back[10]=mch->ix_back[20]=mch->ix_back[30]=15;
  218.  
  219.                 cnum=1;
  220.                 for(i=1;i<11;i++)
  221.                 {
  222.                     mch->palette.Triplet[cnum].Red  =0l;
  223.                     mch->palette.Triplet[cnum].Green=0l;
  224.                      mch->palette.Triplet[cnum].Blue =(ULONG)(0x01010101*cd[i]);
  225.                     cnum++;
  226.                 }
  227.                 for(i=1;i<11;i++)
  228.                 {
  229.                     mch->palette.Triplet[cnum].Red  =0l;
  230.                     mch->palette.Triplet[cnum].Green=(ULONG)(0x01010101*cd[i]);
  231.                      mch->palette.Triplet[cnum].Blue =0l;
  232.                     cnum++;
  233.                 }
  234.                 for(i=1;i<11;i++)
  235.                 {
  236.                     mch->palette.Triplet[cnum].Red  =(ULONG)(0x01010101*cd[i]);
  237.                     mch->palette.Triplet[cnum].Green=0l;
  238.                      mch->palette.Triplet[cnum].Blue =0l;
  239.                     cnum++;
  240.                 }
  241.                 mch->palette.Triplet[cnum].Red  =0xFFFFFFFF;
  242.                 mch->palette.Triplet[cnum].Green=0xFFFFFFFF;
  243.                  mch->palette.Triplet[cnum].Blue =0xFFFFFFFF;
  244.                 mch->palette.NumColors=32;
  245.                 mch->cfact=15.0;
  246.                 break;
  247.             case 8:            /* r,g,b 85 Abstufungen => 614125 Farben */
  248.                 cnum=1;
  249.                 mch->ix_b[0]=0;
  250.                 for(i=1;i<85;i++) { mch->ix_b[i]=cnum;cnum++; }
  251.                 mch->ix_g[0]=0;
  252.                 for(i=1;i<85;i++) { mch->ix_g[i]=cnum;cnum++; }
  253.                 mch->ix_r[0]=0;
  254.                 for(i=1;i<85;i++) { mch->ix_r[i]=cnum;cnum++; }
  255.  
  256.                 cnum=1;
  257.                 mch->ix_back[0]=0;
  258.                 for(i=1;i<85;i++) { mch->ix_back[cnum]=i;cnum++; }
  259.                 for(i=1;i<85;i++) { mch->ix_back[cnum]=i;cnum++; }
  260.                 for(i=1;i<85;i++) { mch->ix_back[cnum]=i;cnum++; }
  261.  
  262.                 cnum=1;
  263.                 for(i=1;i<85;i++)
  264.                 {
  265.                     mch->palette.Triplet[cnum].Red  =0l;
  266.                     mch->palette.Triplet[cnum].Green=0l;
  267.                      mch->palette.Triplet[cnum].Blue =(ULONG)(0x01010101*(i*3));
  268.                     cnum++;
  269.                 }
  270.                 for(i=1;i<85;i++)
  271.                 {
  272.                     mch->palette.Triplet[cnum].Red  =0l;
  273.                     mch->palette.Triplet[cnum].Green=(ULONG)(0x01010101*(i*3));
  274.                     mch->palette.Triplet[cnum].Blue =0l;
  275.                     cnum++;
  276.                 }
  277.                 for(i=1;i<85;i++)
  278.                 {
  279.                     mch->palette.Triplet[cnum].Red  =(ULONG)(0x01010101*(i*3));
  280.                     mch->palette.Triplet[cnum].Green=0l;
  281.                     mch->palette.Triplet[cnum].Blue =0l;
  282.                     cnum++;
  283.                 }
  284.                 mch->palette.Triplet[cnum].Red  =0xFFFFFFFF;
  285.                 mch->palette.Triplet[cnum].Green=0xFFFFFFFF;
  286.                  mch->palette.Triplet[cnum].Blue =0xFFFFFFFF;
  287.                 mch->palette.NumColors=256;
  288.                 mch->cfact=84.0;
  289.                 break; 
  290.         }
  291.         mch->palette.FirstColor=0;
  292.         mch->palette.Terminator=0;
  293.         LoadRGB32(mch->vp,&(mch->palette));
  294.  
  295.         mch->error.r=mch->error.g=mch->error.b=0.0;
  296.     }
  297.     return(mch);
  298. }
  299.  
  300. void MC_Free(MCHandle *mch)
  301. {
  302.     if(mch)    FreeMem(mch,sizeof(MCHandle));
  303. }
  304.  
  305. /***********************************************************************************************************/
  306.  
  307. void MC_PutPixel(MCHandle *mch,UWORD x,UWORD y,MCPoint pt)
  308. {
  309.     UWORD rx,ry;
  310.     UBYTE r,g,b;
  311.     double t;
  312.  
  313.     rx=x+(x>>1);ry=y<<1;
  314.     t=pt.r*mch->cfact+mch->error.r;mch->error.r=t-(double)((UBYTE)t);r=(UBYTE)t;
  315.     t=pt.g*mch->cfact+mch->error.g;mch->error.g=t-(double)((UBYTE)t);g=(UBYTE)t;
  316.     t=pt.b*mch->cfact+mch->error.b;mch->error.b=t-(double)((UBYTE)t);b=(UBYTE)t;
  317.     switch(y%3)
  318.     {
  319.         case 0:
  320.             if(!(x&1))
  321.             {
  322.                 WritePixel(&(mch->rp[mch->ix_r[r]]),rx,ry+1);
  323.                 WritePixel(&(mch->rp[mch->ix_g[g]]),rx,ry);
  324.                 WritePixel(&(mch->rp[mch->ix_b[b]]),rx+1,ry);
  325.             }
  326.             else
  327.             { 
  328.                 WritePixel(&(mch->rp[mch->ix_g[g]]),rx,ry+1);
  329.                 WritePixel(&(mch->rp[mch->ix_b[b]]),rx+1,ry+1);
  330.                 WritePixel(&(mch->rp[mch->ix_r[r]]),rx+1,ry);
  331.             }
  332.             break;
  333.         case 1:
  334.             if(!(x&1))
  335.             {
  336.                 WritePixel(&(mch->rp[mch->ix_b[b]]),rx,ry+1);
  337.                 WritePixel(&(mch->rp[mch->ix_r[r]]),rx,ry);
  338.                 WritePixel(&(mch->rp[mch->ix_g[g]]),rx+1,ry);
  339.             }
  340.             else
  341.             {
  342.                 WritePixel(&(mch->rp[mch->ix_r[r]]),rx,ry+1);
  343.                 WritePixel(&(mch->rp[mch->ix_g[g]]),rx+1,ry+1);
  344.                 WritePixel(&(mch->rp[mch->ix_b[b]]),rx+1,ry);
  345.             }
  346.             break;
  347.         case 2:
  348.             if(!(x&1))
  349.             {
  350.                 WritePixel(&(mch->rp[mch->ix_g[g]]),rx,ry+1);
  351.                 WritePixel(&(mch->rp[mch->ix_b[b]]),rx,ry);
  352.                 WritePixel(&(mch->rp[mch->ix_r[r]]),rx+1,ry);
  353.             }
  354.             else
  355.             {
  356.                 WritePixel(&(mch->rp[mch->ix_b[b]]),rx,ry+1);
  357.                 WritePixel(&(mch->rp[mch->ix_r[r]]),rx+1,ry+1);
  358.                 WritePixel(&(mch->rp[mch->ix_g[g]]),rx+1,ry);
  359.             }
  360.             break;
  361.     }
  362. }
  363.  
  364. MCPoint MC_GetPixel(MCHandle *mch,UWORD x,UWORD y)
  365. {
  366.     UWORD rx,ry;
  367.     UBYTE r,g,b;
  368.     MCPoint akt;
  369.  
  370.     r=g=b=0;
  371.     rx=x+(x>>1);ry=y<<1;
  372.     switch(y%3)
  373.     {
  374.         case 0:
  375.             if(!(x&1))
  376.             {
  377.                 r=ReadPixel(&(mch->rp[0]),rx,ry+1);
  378.                 g=ReadPixel(&(mch->rp[0]),rx,ry);
  379.                 b=ReadPixel(&(mch->rp[0]),rx+1,ry);
  380.             }
  381.             else
  382.             { 
  383.                 g=ReadPixel(&(mch->rp[0]),rx,ry+1);
  384.                 b=ReadPixel(&(mch->rp[0]),rx+1,ry+1);
  385.                 r=ReadPixel(&(mch->rp[0]),rx+1,ry);
  386.             }
  387.             break;
  388.         case 1:
  389.             if(!(x&1))
  390.             {
  391.                 b=ReadPixel(&(mch->rp[0]),rx,ry+1);
  392.                 r=ReadPixel(&(mch->rp[0]),rx,ry);
  393.                 g=ReadPixel(&(mch->rp[0]),rx+1,ry);
  394.             }
  395.             else
  396.             {
  397.                 r=ReadPixel(&(mch->rp[0]),rx,ry+1);
  398.                 g=ReadPixel(&(mch->rp[0]),rx+1,ry+1);
  399.                 b=ReadPixel(&(mch->rp[0]),rx+1,ry);
  400.             }
  401.             break;
  402.         case 2:
  403.             if(!(x&1))
  404.             {
  405.                 g=ReadPixel(&(mch->rp[0]),rx,ry+1);
  406.                 b=ReadPixel(&(mch->rp[0]),rx,ry);
  407.                 r=ReadPixel(&(mch->rp[0]),rx+1,ry);
  408.             }
  409.             else
  410.             {
  411.                 b=ReadPixel(&(mch->rp[0]),rx,ry+1);
  412.                 r=ReadPixel(&(mch->rp[0]),rx+1,ry+1);
  413.                 g=ReadPixel(&(mch->rp[0]),rx+1,ry);
  414.             }
  415.             break;
  416.     }
  417.     akt.r=(double)mch->ix_back[r]/mch->cfact;
  418.     akt.g=(double)mch->ix_back[g]/mch->cfact;
  419.     akt.b=(double)mch->ix_back[b]/mch->cfact;
  420.     return(akt);
  421. }
  422.